package com.liruo.treasureattic.service.url.controller;

import com.liruo.treasureattic.common.httpmsg.result.BaseResponse;
import com.liruo.treasureattic.common.model.dto.url.*;
import com.liruo.treasureattic.common.model.vo.url.UrlFolderVo;
import com.liruo.treasureattic.common.model.vo.url.UrlQueryVo;
import com.liruo.treasureattic.common.model.vo.url.UrlVo;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author:liruo
 * @Date:2023-02-09-20:40:19
 * @Desc
 */
@RequestMapping("/url")
public interface UrlController {
    //url
    /**
     * 加url name只检测长度
     */
    @PostMapping("/post")
    BaseResponse<Long> addUrl(@RequestBody UrlAddReq urlAddReq);
    /**
     * 更新url，不能更新到默认folder下
     */
    @PostMapping("/update")
    BaseResponse<Boolean> updateUrl(@RequestBody UrlUpdateReq urlUpdateReq);


    //folder
    /**
     * name只检测长度
     * 只在用户注册的时候调用,每个user只有一个
     * @param defaultFolderAddReq   fid==null
     * @return folderId
     */
    @PostMapping("/folder/post/default")
    BaseResponse<Long> addDefaultFolder(@RequestBody UrlFolderAddReq defaultFolderAddReq);
    /**
     * name只检测长度
     * @param folderAddReq fid!=null
     * @return folderId
     */
    @PostMapping("/folder/post")
    BaseResponse<Long> addFolder(@RequestBody UrlFolderAddReq folderAddReq);

    /**
     * 更新folder
     */
    @PostMapping("/folder/update")
    BaseResponse<Boolean> updateFolder(@RequestBody UrlFolderUpdateReq urlFolderUpdateReq);


    //查询
    /**
     * 一层级查询
     *  folderId==null ---查询默认folder
     * @return folder的子folder以及folder的url
     */
    @PostMapping("/list/slow")
    BaseResponse<UrlQueryVo> queryOnce(@RequestBody UrlQueryOneLevelReq urlQueryOneLevelReq);

    /**
     *
     * @return 一个folder的urls
     */
    @GetMapping("/list/{fid}")
    BaseResponse<List<UrlVo>> queryUrlsByFid(@PathVariable("fid") Long fid);

    /**
     * @return user的全部folder 仅仅是folder
     */
    @GetMapping("/folder/list/all")
    BaseResponse<List<UrlFolderVo>> queryAllFolder();

    //导入

    /**
     *  解析的rootFolder是一个总folder
     *        浏览器工具栏上的书签目录以及书签在一个叫toolbar的folder里,toolbar在rootFolder中
     *       其他书签就直接在rootFolder下
     *
     *     TO_DEFAULT_FOLDER(0,"把解析结果直接放到默认folder下")
     *          返回rootFolder
     *     TO_NEW_FOLDER(1,"把解析结果直接放到新建的folder下")
     *          返回新建的folder， 把rootFolder设置为urlFolderAddReq的name和open和fid
     *     以上2个使用collectUrlAndFolder进行对folder的id的抢占，因此最后使用update而不是save
     *
     *     SELF_ADJUST(2,"- 进行自我调整(把上传的与当前的进行重组)后再重新上传保存-结果返回后，前端应该再请求所有folder，这些folder会有点击就查询url的功能"),
     *          返回导入的folder和url视图，folder和url使用的都是临时的id(使用id生成器生成的)，在SELF_ADJUST_REUPLOAD时会设为null进行保存
     *     SELF_ADJUST_REUPLOAD(3, "自我调整的重新上传变化后的father关系的folder和url保存")
     *          删除了临时id，返回导入的数据 按数据库的id降序拿size个
     *         1. 需要把folder和url的假id删除
     *         2. 重新上传的包括本就有的和导入的，都存在被修改和被删除的情况，而且导入的被删除前端不会加入
     *
     *     3次保存都用saveOrUpdateAll，前2个是更新，第三个是保存
     */
    @PostMapping("/import/html")
    BaseResponse<List<UrlFolderVo>> importUrlByHtml(HtmlUrlImportReq htmlUrlImportReq);

    //删除
    /**
     * 软删除url
     */
    @PostMapping("/del/{urlId}")
    BaseResponse<Boolean> delUrl(@PathVariable("urlId") Long urlId);

    /**
     * 软删除folder以及子folder和url， 放进回收站，定时清理，可以恢复
     */
    @PostMapping("/folder/del/{folderId}")
    BaseResponse<Boolean> delFolder(@PathVariable("folderId") Long folderId);
}
